﻿#define _CRT_SECURE_NO_WARNINGS 1
/*
找X图案
问题描述
　　给定一个字母矩阵。一个 X 图形由中心点和由中心点向四个45度斜线方向引出的直线段组成，四条线段的长度相同，而且四条线段上的字母和中心点的字母相同。
　　一个 X图形可以使用三个整数 r, c, L 来描述，其中 r, c 表示中心点位于第 r 行第 c 列，正整数 L 表示引出的直线段的长度。 对于 1 到 L 之间的每个整数 i，X图形满足：第 r-i 行第 c-i 列与第 r 行第 c 列相同，第 r-i 行第 c+i 列与第 r 行第 c 列相同，第 r+i 行第 c-i 列与第 r 行第 c 列相同，第 r+i 行第 c+i 列与第 r 行第 c 列相同。
　　例如，对于下面的字母矩阵中，所有的字母 L 组成一个 X图形，其中中间的 5 个 L 也组成一个 X图形。所有字母 Q 组成了一个 X图形。
　　LAAALA
　　ALQLQA
　　AALQAA
　　ALQLQA
　　LAAALA
　　给定一个字母矩阵，请求其中有多少个 X图形。
	输入格式
　　输入第一行包含两个整数 n, m，分别表示字母矩阵的行数和列数。
　　接下来 n 行，每行 m 个大写字母，为给定的矩阵。
输出格式
　　输出一行，包含一个整数，表示答案。
评测用例规模与约定

​ 对于 50% 的评测用例，1 <= n, m <= 10。
　　对于所有评测用例，1 <= n, m <= 100。

*/
#include <stdio.h>
#define N 100
int isX(int i, int j);
char jz[N][N + 1];
int main() {
	int m, n, count = 0;
	scanf("%d %d\n", &n, &m);
	for (int i = 0; i < n; i++) {
		gets(jz[i]);
	}
	for (int i = 1; i < n - 1; i++) {
		for (int j = 1; j < m - 1; j++) {
			count += isX(i, j);
		}
	}
	printf("%d\n", count);
	return 0;
}
int min(int a, int b) {
	return a < b ? a : b;
}
int isX(int i, int j) {
	int count = 0;
	for (int a = 1; a <= min(i, j); a++) {
		if (jz[i][j] == jz[i - a][j - a] && jz[i][j] == jz[i - a][j + a] && jz[i][j] == jz[i + a][j - a] && jz[i][j] == jz[i + a][j + a])count++;
		else break;
	}
	return count;
}
